// 给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
// 54. 螺旋矩阵
//用到哪些算法：
//最优解法
//思路：
//1. 先按照顺时针方向，从左上角开始，一圈一圈的遍历，每一圈的元素都是从左上角开始，
//   向右走，向下走，向右走，向下走，向右走，向下走，向右走，向下走，向右走，向下走，
// var spiralOrder = function (matrix) {
//   if (matrix.length === 0) return []
//   const res = []
//   let top = 0, bottom = matrix.length - 1, left = 0, right = matrix[0].length - 1
//   while (top < bottom && left < right) {  // 只要不是边界，就一直循环
//     for (let i = left; i < right; i++) res.push(matrix[top][i])   // 左上角到右上角
//     for (let i = top; i < bottom; i++) res.push(matrix[i][right]) // 右上角到右下角
//     for (let i = right; i > left; i--) res.push(matrix[bottom][i])// 右下角到左下角
//     for (let i = bottom; i > top; i--) res.push(matrix[i][left])  // 左下角到左上角
//     right-- // 右边界减少
//     top++ // 上边界增加
//     bottom--  // 下边界减少
//     left++  // 四个边界同时收缩，进入内层
//   }
//   if (top === bottom) // 剩下一行，从左到右依次添加
//     for (let i = left; i <= right; i++) res.push(matrix[top][i])  // 只有一行
//   else if (left === right) // 剩下一列，从上到下依次添加
//     for (let i = top; i <= bottom; i++) res.push(matrix[i][left]) // 只有一列
//   return res
// };

var spiralOrder = function (matrix) {
  if (matrix.length===0) return []; //
  let res = [];
  //定义宽高
  let top = 0, bottom = matrix.length - 1, left = 0, right = matrix[0].length-1;
  while (top < bottom&&left < right) {
    for (let i = left; i < right; i++)res.push(matrix[top][i])
    for (let i = top; i < bottom; i++)res.push(matrix[i][right])
    for (let i = right; i > left; i--)res.push(matrix[bottom][i])
    for(let i=bottom; i >top; i--)res.push(matrix[i][left])
    left++;
    right--;
    top++;
    bottom--;
  }
  if (left === right) {
    for (let i = top; i < bottom; i++)res.push(matrix[i][left]);
  }
  if (top === bottom) {
    for (let i = left; i < right; i++)res.push(matrix[top][i]);
  }
  return res;
};
console.log(spiralOrder([[1,2,3],[4,5,6],[7,8,9]]));